'''

当需要创建的子进程数量不多时，可以直接利用multiprocessing中的Process动态生成多个子进程
但如果是上百甚至上千个目标，手动的创建进程的工作量巨大，此时就可以用到multiprocessing模块提供的Pool方法
初始化Pool时，可以指定一个最大进程数，当有新的请求提交到Pool中时，如果池还没有满，那么
就会创建一个新的进程用来执行该请求，但如果池中 的进程数已经达到指定的最大值，那么该请求就会等待
知道池中有进程 结束，才会创建新的进程来执行

非阻塞式：
    全部添加到队列中。立即返回，并没有等待其他的进程执行完毕，但是回调函数是等待任务完成之后才调用
阻塞式：
    添加一个执行一个任务，如果一个任务不结束 另一个任务就进不来

 进程池：
    pool = Pool(max) 创建进程池对象
    pool.apply() 阻塞的
    pool.apply_async() 非阻塞的

    pool.close()
    pool.join() 让主进程让步等待

'''
import os
import random
import time
from multiprocessing import Pool


# 非阻塞式进程
def task(task_name):
    print("开始做任务了!", task_name)
    start = time.time()
    time.sleep(random.random() * 2)
    end = time.time()
    # print("完成任务用时:{}， pid={}".format((end - start), os.getpid()))

    return "完成任务用时:{}， pid={}".format((end - start), os.getpid())


container = []


def callback_func(n):
    print('----->', n)
    container.append(n)


if __name__ == '__main__':
    pool = Pool(5)
    for i in range(8):
        pool.apply_async(task, args=('task' + str(i),), callback=callback_func)

    pool.close()  # 添加任务结束
    pool.join()
    print("over@@@@")
    print(container)
